iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
AI/ ML & Data

從點子構想到部署上線:機器學習專案的一生系列 第 23

[Day 23] Metaflow - Part 2. Parameters、版本紀錄、Metaflow UI、Card

  • 分享至 

  • xImage
  •  

昨天我們認識了 Metaflow 的基本用法,今天讓我們深入探討一些進階設定和功能。

Parameters、IncludeFile 和版本紀錄

Parameters 和 IncludeFile

Metaflow 提供了兩種主要的方式來處理外部數據和參數:ParametersIncludeFile

  • Parameters:用於傳遞簡單的數值、字串,或是 json 格式,若想要呼叫檔案,使用者需要在程式內自行載入檔案。
  • IncludeFile:直接將檔案內容嵌入 flow 中,Metaflow 會紀錄檔案版本內容,方便管理和檔案追溯。
    • 可以用 run.data.movie_data 查看檔案內容。

以下是一個結合了 ParametersIncludeFile 的程式碼範例:

from metaflow import FlowSpec, step, Parameter, IncludeFile
import pandas as pd

class NetflixMatchCuttingFlow(FlowSpec):
    ### Parameter 可以傳字串 ###
    video_path = Parameter('video_path', help='Path to the input video')
    
    ### Parameter 也可以傳 json 格式 ###
    video_config = Parameter('video_config',
                    help='The configuration of the video',
                    type=JSONType,
                    default='{"duration": 3, "audio_sample_rate": 16000}')
                    
    ### IncludeFile 會直接儲存檔案內容 ###
    movie_metadata = IncludeFile(
        "movie_metadata",
        help="The path to a movie metadata file.",
        default="movies.csv",
    )

    @step
    def start(self):
        """ Load the videos """
        self.video = load_video(self.video_path)
        movie_metadata_df = pd.read_csv(self.movie_metadata)
        self.next(self.scene_detection, self.audio_analysis)
        
    @step
    def parse_video(self):
        continue
        
    @step
    def end(self):
        print("Process completed successfully!")

呼叫方式:python parameter_flow.py run --video_path /path/to/videos/ --video_config '{"duration": 5, "audio_sample_rate": 24000}' --movie_metadata movies.csv

Artifacts

在 Metaflow 中,artifacts 是在 flow 的執行過程中產生的資料。Metaflow 會自動保存每個步驟的 artifacts ,並在不同的步驟之間傳遞。每次執行 flow 時都會產生一個新的版本,方便我們追蹤數據,並在 flow 完成後,可以使用 Python API 以查詢數據內容。

在執行完 flow 之後,可以利用下面的程式碼來查看 artifacts:

from metaflow import Flow

run = Flow('PlayListFlow').latest_successful_run
print("Using run: %s" % str(run))  # 印出 run 的 id

print(run.data)  # 印出所有儲存的 artifacts

## 指定要查詢的 Flow 名稱,會印出所有這個 flow 的執行紀錄
for run in Flow('NetflixMatchCuttingFlow').runs():
    if run.successful:
        print(f"Videos processed on {run.finished_at}")
        
        ## 可以查看 IncludeFile 的內容
        print(f"Movie Metadata {run.movie_metadata}")
        
        ## 查看被處理過的 video
        print(f"Processed videos {run.video}")
        print('\n')

Visualize

Metaflow UI

Metaflow 有提供 UI:https://github.com/Netflix/metaflow-ui?tab=readme-ov-file
但我們就不要自己架了,先用他們架好的 sandbox 來測試看看。

https://ithelp.ithome.com.tw/upload/images/20241004/20152325UTOADoWRwP.png

https://ithelp.ithome.com.tw/upload/images/20241004/20152325FIRJ1P2oJF.png

Metaflow Card

Metaflow 有提供 card 這個功能,協助我們輕鬆地分享結果。Metaflow Card 是一個 HTML 檔案,會顯示與特定任務相關的所有資訊,例如:

  • Flow 的 metadata:包含名稱、執行時間、參數等基本資訊。
  • 流程的 DAG:顯示流程中所有步驟和之間的關係。
  • 視覺化:如果結果中包含圖片或 dataframe,metaflow 會直接顯示在 card 上,方便我們查看結果。

Metaflow card 如下所示:

https://ithelp.ithome.com.tw/upload/images/20241004/20152325mJ8WXH9Hlk.png

https://ithelp.ithome.com.tw/upload/images/20241004/20152325bEfHKH9vsy.png

而要如何產生 Metaflow Card 呢?有以下幾種方式:

  1. 在想要紀錄的 step 加上 @card,Metaflow 就會在每次執行時自動產生 card。
  2. 若沒有在 step 加上 @card,也不想重新修改程式碼,可以在執行 flow 時,使用 python flow.py run --with card,這樣也會在執行時附加預設的 card。

若想要檢視 card,可以用以下幾個方法:

  • 使用 python flow.py card view <task_id> 命令,輸入想要檢視的 task_id,此 id 可以用上面示範過的 Flow('NetflixMatchCuttingFlow').runs() 來查詢。
  • 執行 python flow.py card server,會啟動 local server,可以在瀏覽器中訪問 localhost:8324

最後,如果想要分享 card,可以使用 python flow.py card get <task_id> filename.html,將 card 儲存為 HTML 檔案,進而分享給其他人。

以下是產生上面的 card 示意圖的程式碼,我沒有在每個 step 加上 @card,而是直接在執行 flow 時,加上 --with card,Metaflow 就幫我將 flow 裡面的圖片和 dataframe 都顯示在 card 中。

from metaflow import FlowSpec, Parameter, step
import requests, pandas, string

URL = "https://upload.wikimedia.org/wikipedia/commons/4/45/Blue_Marble_rotating.gif"

class FancyDefaultCardFlow(FlowSpec):

    image_url = Parameter('image_url', default=URL)

    @step
    def start(self):
        self.image = requests.get(self.image_url,
                                  headers={'user-agent': 'metaflow-example'}).content
        self.dataframe = pandas.DataFrame({'lowercase': list(string.ascii_lowercase),
                                           'uppercase': list(string.ascii_uppercase)})
        self.next(self.end)

    @step
    def end(self):
        pass

if __name__ == "__main__":
    FancyDefaultCardFlow()

經過今天的介紹後,有沒有覺得 Metaflow 又更加方便好用啦!
我們目前都是在 local 上面執行,明天來看看他又可以怎麼樣方便地幫我們部署到 cloud 上吧!


謝謝讀到最後的你,如果喜歡這系列,別忘了按下喜歡和訂閱,才不會錯過最新更新。
如果有任何問題想跟我聊聊,或是想看我分享的其他內容,也歡迎到我的 Instagram(@data.scientist.min) 逛逛!
我們明天見!


Reference:
[1] https://docs.metaflow.org/metaflow/visualizing-results/effortless-task-inspection-with-default-cards


上一篇
[Day 22] Metaflow - Part 1. 介紹跟基本功能
下一篇
[Day 24] Metaflow - Part 3. Model Training & Cloud Resources
系列文
從點子構想到部署上線:機器學習專案的一生30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言